﻿#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//int main()
//{
//	int a = 1;
//	if (*(char*)&a == 1)
//		printf("小端\0");
//	else
//		printf("大端\0");
//	return 0;
//}
//#include<stdio.h>
//int main()
//{
//	char a = -1;//默认是signed char   
//	signed char b = -1;
//	unsigned char c = -1;
//	printf("a = %d, b = %d, c = %d", a, b, c);
//	//signed char的取值范围是 -128~127
//	//unsigned char的取值范围是 0~255
//	//一个字节含有八个比特位:
//	//内存中的8个bit位能存储的数据:
//	// signed char   00000000     0             unsigned char  00000000     0
//	//               00000001     1                            00000001     1
//	//               00000010     2                            00000010     2
//	//               00000011     3                            00000011     3
//	//               ...          ...                          ...          ...
//	//               01111111     127                          01111111     127
//	//               10000000     -128                         10000000     128
//	//               10000001     -127                         10000001     129
//	//               10000010     -126                         10000010     130
//	//               ...          ...                          ...          ...
//	//               11111100     -4                           11111100    
//	//               11111101     -3                           11111101
//	//               11111110     -2                           11111110
//	//               11111111     -1                           11111111     256
//	//对于有符号位来说前面的正常计算，但是一旦有了符号位我们便要取反，+1去看看对应的数字是多少
//	//对于无符号的char我们在原有基础上加就好了
//	//可以类比到signed short与unsigned short，他们都占2个字节即16个比特位
//	//unsigned short有16个数值位而signed有1个符号位和15个数值位
//	return 0;
//}
//#include<stdio.h>
//int main()
//{
//	char a = -1;//默认是signed char   
//	//10000000 00000000 00000000 00000001 -1原码
//	//11111111 11111111 11111111 11111111 -1补码
//	//但是-1是整型32个bit位而char中只有8个bit位存不下这么多
//	//所以a中实际存放的是 11111111 a发生了整型提升
//	//变为了11111111 11111111 11111111 11111111 补码
//	//再回去找原码发现还是-1
//	signed char b = -1;
//	//11111111 b然后整型提升返回找原码与a一致
//	unsigned char c = -1;
//	//11111111 c的补码再进行整型提升，无符号高位补0
//	//00000000 00000000 00000000 11111111
//	//这是无符号整数不需要再取反加1操作就可以看出来这是多少了
//	printf("a = %d, b = %d, c = %d", a, b, c);//%d是以10进制的形式打印有符号的整数
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	char a = -128;//内存中放的是补码
//	//10000000 00000000 00000000 10000000 -128原码
//	//11111111 11111111 11111111 10000000 -128补码
//	//但是a中实际储存的是 10000000
//	//整型提升我们看a的类型是char，根据a的类型来提升
//	//11111111 11111111 111111111 10000000 补码
//	//我们用%u来打印就是超级大的数，无符号整数原、反、补相同
//	printf("%u\n", a);
//	//%u是以10进制形式打印无符号的整数(内存中存储的是无符号整数的补码)
//	//%d是以10进制的形式打印有符号的整数
//	//(认为我们要打印的数据在内存中是以有符号数的补码进行存储的)
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	char a = 128;
//	//00000000 00000000 00000000 10000000 128原码
//	//00000000 00000000 00000000 10000000 128补码
//	//a中实际储存的是 10000000
//	//整型提升 char类型默认signed char
//	//11111111 11111111 11111111 10000000 补码
//	//我们用%u来打印就是超级大的数，无符号整数原、反、补相同
//	printf("%u\n", a);
//	return 0;
//}
//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char a[1000];//默认是signed char取值范围是-128~127
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	//-1 -2 -3 -4 -5 ... -1000
//	//\0的ASCLL码值是0，我们找到0即可前面-1~-128都正常
//	//当他变成-129时再进行整型提升会被编译器解析成127，然后126...最后变为0就停止了
//	//0后面还有数字，但是strlen不会再统计了
//	printf("%d", strlen(a));//求字符串的长度，其实是统计\0之前字符的个数
//	return 0;
//}
//#include <stdio.h>
//unsigned char i = 0;//取值范围是0~255
//int main()
//{
//	//超过取值范围死循环
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}
//#include <stdio.h>
//#include<windows.h>
//int main()
//{
//	unsigned int i;
//	//i>=0
//	for (i = 9; i >= 0; i--)
//	{
//		printf("%u\n", i);
//		Sleep(2000);
//	}
//	return 0;
//}
#include <stdio.h>
//X86环境 ⼩端字节序 
int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x, %x", ptr1[-1], *ptr2);
	return 0;
}